home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / capus2 / eshell / sources / eshell.e next >
Text File  |  1995-03-31  |  10KB  |  351 lines

  1. /*======<<< Peps Header >>>======
  2.  PRGVERSION '0'
  3.  ================================
  4.  PRGREVISION '1'
  5.  ================================
  6.  AUTHOR      'NasGûl (ß version)'
  7.  ===============================*/
  8. /*======<<<   History   >>>======
  9.  
  10.  - 0.1 commands:
  11.         cd/pslist/reset/pcdir/d/changedsp
  12.         mdir/delay/setcom/del/ass en cours/fullsize
  13.         syslist.
  14.  
  15.  ===============================*/
  16.  
  17. OPT OSVERSION=37
  18. CONST DEBUG=FALSE
  19. /*"MODULES LIST"*/
  20. MODULE 'dos/dos'
  21. MODULE 'dos/rdargs'
  22. MODULE 'dos/dosextens'
  23. MODULE 'dos/dosasl','utility','dos/dostags'
  24. MODULE 'eropenlib'
  25. MODULE 'intuition/intuition'
  26. MODULE 'intuition/screens'
  27. MODULE 'intuition/intuitionbase'
  28. MODULE 'exec/nodes','exec/lists','exec/ports','exec/memory','exec/execbase','exec/tasks','exec/libraries'
  29. MODULE 'mheader'
  30. /*=== Commande ListCom ===*/
  31. MODULE 'commodities'
  32.  
  33. /**/
  34. /*"PMODULES LIST"*/
  35. PMODULE 'EshellList'
  36. PMODULE 'EShellCom1'
  37. PMODULE 'lc'
  38. PMODULE 'PModules:dWriteF'
  39. PMODULE 'PModules:PMHeader'
  40. /**/
  41. /*"CONST/ENUM/OBJECTS/RAISE"*/
  42.  
  43. CONST MAXPATH=250
  44.  
  45. ENUM ER_NONE,ER_MEM
  46.  
  47. OBJECT filenode
  48.     node:ln             /* ln.name=filename */
  49.     direntrytype:LONG   /* like fileinfoblock */
  50.     curdirname:LONG
  51.     protection:LONG
  52.     size:LONG
  53.     numblocks:LONG
  54.     comment:LONG
  55. ENDOBJECT
  56.  
  57. RAISE ER_MEM IF New()=NIL,        /* set common exceptions:                */
  58.       ER_MEM IF String()=NIL      /* every call to these functions will be */
  59.       /*
  60.       ERROR_BREAK IF CtrlC()=TRUE /* automatically checked against NIL,    */
  61.                                   /* and the exception ER_MEM is raised    */
  62.                                   */
  63.  
  64. /* Commande SysList */
  65.  
  66. SET  LIST_TASK,LIST_LIBRARY,LIST_DEVICE,LIST_PORT,LIST_WINDOW,
  67.      LIST_MEMORY
  68.  
  69. /**/
  70. /*"APPLICATION DEF"*/
  71. DEF prompt[256]:STRING
  72. DEF cdn[256]:STRING
  73. DEF bdn[256]:STRING
  74. DEF pro:PTR TO process
  75. DEF cl:PTR TO commandlineinterface
  76. DEF con
  77. DEF filelist:PTR TO lh,freenode
  78. /**/
  79. /*"COMMANDS LIST"*/
  80. /*"ASS COMMAND"*/
  81. /*"ass(s)"*/
  82. PROC ass(s)
  83.     DEF m:PTR TO LONG
  84.     DEF argstr[256]:STRING
  85.     DEF l,ll
  86.     DEF logicname[256]:STRING
  87.     DEF physicname[256]:STRING
  88.     DEF r
  89.     DEF dl:PTR TO doslist,mask
  90.     /* DosList */
  91.     m:=[0,0,0,0,0,0,0,0]
  92.     MidStr(argstr,s,3,ALL)
  93.     IF getArg(argstr,'Nom,Dossier,Add/S,Late/S,Remove/S,V=VolList/S,D=DevicesList/S,A=AssignList/S',m)
  94.         IF m[0] THEN StrCopy(logicname,m[0],ALL)
  95.         IF m[1] THEN StrCopy(physicname,m[1],ALL)
  96.         IF Not(m[4])
  97.             r:=InStr(logicname,':',0)
  98.             IF r<>-1
  99.                 MidStr(argstr,logicname,0,EstrLen(logicname)-1)
  100.                 StrCopy(logicname,argstr,ALL)
  101.             ENDIF
  102.         ENDIF
  103.         IF m[2]
  104.             IF m[0] AND m[1]
  105.                 IF l:=Lock(physicname,-2)
  106.                     ll:=DupLock(l)
  107.                     IF l THEN UnLock(l)
  108.                     r:=AssignAdd(logicname,ll)
  109.                 ENDIF
  110.             ENDIF
  111.             JUMP assend
  112.         ENDIF
  113.         IF m[3]
  114.             IF m[0] AND m[1]
  115.                 r:=AssignLate(logicname,physicname)
  116.             ENDIF
  117.             JUMP assend
  118.         ENDIF
  119.         IF m[4]
  120.             IF m[0]
  121.                 IF l:=Lock(logicname,-2)
  122.                     ll:=DupLock(l)
  123.                     IF l THEN UnLock(l)
  124.                     r:=AssignLock(logicname,NIL)
  125.                 ENDIF
  126.             ENDIF
  127.             JUMP assend
  128.         ENDIF
  129.         IF m[0] AND m[1]
  130.             IF l:=Lock(physicname,-2)
  131.                 ll:=DupLock(l)
  132.                 UnLock(l)
  133.                 r:=AssignLock(logicname,ll)
  134.                 WriteF('\d\n',r)
  135.                 JUMP assend
  136.             ENDIF
  137.         ENDIF
  138.         IF m[5]
  139.             mask:=LDF_VOLUMES+LDF_READ
  140.             dl:=LockDosList(mask)
  141.             WHILE (dl:=NextDosEntry(dl,mask))
  142.                 WriteF('\s:\n',TrimStr(Shl(dl.name,2)))
  143.             ENDWHILE
  144.             UnLockDosList(mask)
  145.         ENDIF
  146.         IF m[6]
  147.             mask:=LDF_DEVICES+LDF_READ
  148.             dl:=LockDosList(mask)
  149.             WHILE (dl:=NextDosEntry(dl,mask))
  150.                 WriteF('\s:\n',TrimStr(Shl(dl.name,2)))
  151.             ENDWHILE
  152.             UnLockDosList(mask)
  153.         ENDIF
  154.         IF m[7]
  155.             mask:=LDF_ASSIGNS+LDF_READ
  156.             dl:=LockDosList(mask)
  157.             WHILE (dl:=NextDosEntry(dl,mask))
  158.                 WriteF('\s:\n',TrimStr(Shl(dl.name,2)))
  159.             ENDWHILE
  160.             UnLockDosList(mask)
  161.         ENDIF
  162.     ELSE
  163.         WriteF('Bad Args!!.\n')
  164.     ENDIF
  165.     assend:
  166.     m[0]:=0;m[1]:=0;m[2]:=0;m[3]:=0;m[4]:=0;m[5]:=0;m[6]:=0;m[7]:=0
  167. ENDPROC
  168. /**/
  169. /**/
  170. /*"LISTCOM COMMAND"*/
  171. /*"listcom()"*/
  172. PROC listcom()
  173.     DEF l:PTR TO lh,r
  174.     DEF n:PTR TO ln
  175.     IF cxbase:=OpenLibrary('commodities.library',0)
  176.         r:=p_InitList()
  177.         CopyBrokerList(r)
  178.         l:=r
  179.         n:=l.head
  180.         WHILE n
  181.             IF n.succ<>0
  182.                 WriteF('Nom:\l\s[20] Pri:\d\n',n.name,n.pri)
  183.             ENDIF
  184.             n:=n.succ
  185.         ENDWHILE
  186.         p_CleanList(l,FALSE,0,LIST_REMOVE)
  187.         IF cxbase THEN CloseLibrary(cxbase)
  188.     ELSE
  189.         WriteF('Commodities.library ??\n')
  190.     ENDIF
  191. ENDPROC
  192. /**/
  193. /**/
  194. /**/
  195. /*"APPLICATION PROCEDURES"*/
  196. /*"updateprompt(rc)"*/
  197. PROC updateprompt(rc)
  198.     StringF(prompt,'\e[32m\d.\e[31m\s[\e[33m\d\e[31m]>',pro.tasknum,cdn,rc)
  199. ENDPROC
  200. /**/
  201. /*"makefilelist(a,dirsf,filesf,recf)"*/
  202. PROC makefilelist(a,dirsf,filesf,recf) HANDLE
  203.     DEF er
  204.     DEF i:PTR TO fileinfoblock,size=0
  205.     DEF anchor=NIL:PTR TO anchorpath,fullpath
  206.     DEF ascii[256]:STRING,x,work[256]:STRING,curdir[256]:STRING
  207.     DEF fn:PTR TO filenode,l
  208.     dWriteF(['makefilelist(\s,','\d,','\d,','\d)\n'],[a,dirsf,filesf,recf])
  209.     anchor:=New(SIZEOF anchorpath+MAXPATH)
  210.     anchor.breakbits:=4096
  211.     anchor.strlen:=MAXPATH-1
  212.     er:=MatchFirst(a,anchor)                   /* collect all strings */
  213.     WHILE er=0
  214.         fullpath:=anchor+SIZEOF anchorpath
  215.         i:=anchor.info
  216.         StringF(work,'\s',i.filename)
  217.         IF IF i.direntrytype>0 THEN dirsf ELSE filesf
  218.             fn:=New(SIZEOF filenode)
  219.             fn.direntrytype:=i.direntrytype
  220.             IF l:=Lock(fullpath,-2)
  221.                 NameFromLock(l,curdir,256)
  222.                 StrCopy(ascii,curdir,ALL)
  223.                 MidStr(curdir,fullpath,0,StrLen(fullpath)-StrLen(i.filename))
  224.                 fn.curdirname:=String(StrLen(curdir))
  225.                 StrCopy(fn.curdirname,curdir,ALL)
  226.                 IF l THEN UnLock(l)
  227.             ENDIF
  228.             fn.protection:=i.protection
  229.             IF i.direntrytype>0 THEN fn.size:=0 ELSE fn.size:=i.size
  230.             fn.numblocks:=i.numblocks
  231.             fn.comment:=String(StrLen(i.comment))
  232.             StrCopy(fn.comment,i.comment,ALL)
  233.             p_AjouteNode(filelist,work,fn)
  234.         ENDIF
  235.         IF i.direntrytype<0 THEN size:=size+i.size
  236.         IF recf AND (i.direntrytype>0)              /* do recursion(=tail) */
  237.             x:=StrLen(fullpath)
  238.             IF x+5<MAXPATH THEN CopyMem('/#?',fullpath+x,4)
  239.             size:=size+makefilelist(fullpath,dirsf,filesf,recf)
  240.             fullpath[x]:=0
  241.         ENDIF
  242.         er:=MatchNext(anchor)
  243.     ENDWHILE
  244.     IF er<>ERROR_NO_MORE_ENTRIES THEN Raise(er)
  245.     MatchEnd(anchor)
  246.     Dispose(anchor)
  247.     anchor:=NIL
  248. EXCEPT                                  /* nested exception handlers! */
  249.     IF anchor THEN MatchEnd(anchor)
  250.     Raise(exception)  /* this way, we call _all_ handlers in the recursion  */
  251. ENDPROC size        /* and thus calling MatchEnd() on all hanging anchors */
  252. /**/
  253. /*"p_InitData()"*/
  254. PROC p_InitData()
  255.     DEF str[256]:STRING
  256.     DEF cstr[256]:STRING
  257.     pro:=FindTask(NIL)
  258.     cl:=Shl(pro.cli,2)
  259.     GetCurrentDirName(str,256)
  260.     StringF(cstr,'CD \s',str)
  261.     StringF(bdn,'CD \s',str)
  262.     cd(cstr)
  263.     freenode:=[18,DISL,34,DISL,DISE]
  264.     filelist:=p_InitList()
  265.     p_InitCommandList()
  266. ENDPROC TRUE
  267. /**/
  268. /*"p_RemData()"*/
  269. PROC p_RemData()
  270.     p_CleanList(filelist,TRUE,freenode,LIST_REMOVE)
  271. ENDPROC
  272. /**/
  273. /*"getArg(argu,temp,a:PTR TO LONG)"*/
  274. PROC getArg(argu,temp,a)
  275.     DEF myc:PTR TO csource
  276.     DEF ma=NIL:PTR TO rdargs
  277.     DEF rdargs=NIL
  278.     DEF argstr[256]:STRING
  279.     DEF ret=NIL
  280.     StrCopy(argstr,argu,ALL)
  281.     /*
  282.     WriteF('\s\n',argstr)
  283.     IF StrCmp('?',TrimStr(argstr),1) THEN RETURN NIL
  284.     /*IF argu[0]="?" THEN RETURN NIL*/
  285.     */
  286.     StrAdd(argstr,'\n',1)
  287.     IF ma:=AllocDosObject(DOS_RDARGS,NIL)
  288.         myc:=New(SIZEOF csource)
  289.         myc.buffer:=argstr
  290.         myc.length:=EstrLen(argstr)
  291.         ma.flags:=1
  292.         CopyMem(myc,ma.source,SIZEOF csource)
  293.         IF rdargs:=ReadArgs(temp,a,ma)
  294.             /*
  295.             StrCopy(argstr,a[0],ALL)
  296.             WriteF('\s\n',argstr)
  297.             */
  298.             ret:=a
  299.             IF rdargs THEN FreeArgs(rdargs)
  300.         ENDIF
  301.         IF myc THEN Dispose(myc)
  302.         IF ma THEN FreeDosObject(DOS_RDARGS,ma)
  303.     ELSE
  304.         WriteF('AllocDosObject failed !!\n')
  305.     ENDIF
  306. ENDPROC ret
  307. /**/
  308. /*"main()"*/
  309. PROC main()
  310.     DEF inputstring[80]:STRING
  311.     DEF comparestring[80]:STRING
  312.     DEF ret
  313.     DEF m:PTR TO LONG
  314.     DEF rdargs=NIL
  315.     m:=[0]
  316.     IF rdargs:=ReadArgs('Interatif/F',m,NIL)
  317.         IF con:=Open('CONSOLE:',NEWFILE)
  318.             IF p_InitData()
  319.                 p_DoReadHeader({banner})
  320.                 IF m[0]
  321.                     StrCopy(inputstring,m[0],ALL)
  322.                     StrCopy(comparestring,inputstring,ALL)
  323.                     UpperStr(comparestring)
  324.                     lookinternalcommand(comparestring,inputstring)
  325.                     JUMP mainend
  326.                 ENDIF
  327.                 qhelp()
  328.                 WHILE StrCmp(comparestring,'BYE',ALL)=FALSE
  329.                     IF lookinternalcommand(comparestring,inputstring)=FALSE
  330.                         ret:=execute(inputstring,'',4000,0,FALSE)
  331.                         updateprompt(ret)
  332.                     ENDIF
  333.                     Write(con,prompt,EstrLen(prompt))
  334.                     ReadStr(con,inputstring)
  335.                     StrCopy(comparestring,inputstring,ALL)
  336.                     UpperStr(comparestring)
  337.                 ENDWHILE
  338.                 mainend:
  339.                 p_RemData()
  340.             ENDIF
  341.             cd(bdn)
  342.             Close(con)
  343.         ENDIF
  344.         IF rdargs THEN FreeArgs(rdargs)
  345.     ELSE
  346.         WriteF('Bad Arg!!\n')
  347.     ENDIF
  348. ENDPROC
  349. /**/
  350. /**/
  351.